/**
 * 查询字符串处理工具类
 * 
 * 这些函数用于处理URL查询参数的解析和序列化，
 * 它们比默认的查询字符串处理方法提供了更多的灵活性：
 * 1. 支持数组参数
 * 2. 更好地处理特殊字符和空值
 * 3. 可重用于路由配置和其他需要处理查询字符串的场景
 */

/**
 * 自定义的查询字符串解析函数
 * @param {string} query - 要解析的查询字符串
 * @returns {Object} 解析后的对象
 */
export function parseQuery(query) {
    const res = {}
    query = query.trim().replace(/^(\?|#|&)/, '')
    if (!query) {
        return res
    }
    query.split('&').forEach(param => {
        const parts = param.replace(/\+/g, ' ').split('=')
        const key = parts.shift()
        const val = parts.length > 0 ? parts.join('=') : null
        if (res[key] === undefined) {
            res[key] = val
        } else if (Array.isArray(res[key])) {
            res[key].push(val)
        } else {
            res[key] = [res[key], val]
        }
    })
    return res
}

/**
 * 自定义的查询字符串序列化函数
 * @param {Object} obj - 要序列化的对象
 * @returns {string} 序列化后的查询字符串
 */
export function stringifyQuery(obj) {
    const res = []
    for (const key in obj) {
        const val = obj[key]
        if (val === undefined) {
            continue
        }
        if (val === null) {
            res.push(key)
            continue
        }
        if (Array.isArray(val)) {
            val.forEach(val2 => {
                res.push(`${key}=${val2}`)
            })
            continue
        }
        res.push(`${key}=${val}`)
    }
    return res.length ? `?${res.join('&')}` : ''
}
